package Model;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author kiko
 */
public class ConsistencyManager extends Thread {
    ArrayList<String[]> arquivosMudados;
    Socket conection;
    
    public ConsistencyManager(Socket conection) {
        arquivosMudados = new ArrayList<>();
        this.conection = conection;
    }
    
    @Override
    public void run() {
        while (true) {
            try {
                System.out.println("Passou rotina pega arquivo 0");
                for (int i = 0; i < arquivosMudados.size(); i++) {
                    System.out.println("Passou rotina pega arquivo 1");
                    if (arquivosMudados.get(i) != null) {
                        if (System.currentTimeMillis() - Long.parseLong(arquivosMudados.get(i)[1]) > 5000) {
                            System.out.println("Passou rotina pega arquivo 2");
                            updateFile(arquivosMudados.get(i)[0]);
                            break;
                        }
                    } else {
                        arquivosMudados.remove(i);
                    }
                }
                sleep(5000);
            } catch (InterruptedException | IOException e) {
                System.out.println("O ConsistencyManager falhou");
            }
        }
    }
    
    public void add(String arq) {
        if (!arq.equals("null")) {
            System.out.println("O arquivo " + arq + " foi adicionado à lista de alterados");
            String temp = System.currentTimeMillis() + "";
            String[] aux = {arq, temp};
            arquivosMudados.add(aux);
        }
    }
    
    public void updateFile(String arq) throws IOException {
        for (int i = 0; i < arquivosMudados.size(); i++) {
            if (!arq.equals("null")) {
                if (arq.equals(arquivosMudados.get(i)[0])) {
                    DataOutputStream out = new DataOutputStream(conection.getOutputStream());
                    out.writeBytes("GET:" + arq + "\n");
                    arquivosMudados.remove(i);
                    System.out.println("O arquivo " + arq + " foi removido da lista de alterados");
                    break;
                }
            } else {
                arquivosMudados.remove(i);
            }
        }
    }
    
    public void receiveFile() {
        ObjectInputStream inputArc;
        try {
            inputArc = new ObjectInputStream(new BufferedInputStream(conection.getInputStream()));
            String fileName = inputArc.readUTF();
            long size = inputArc.readLong();
            String path = fileName;
            BufferedOutputStream saveArq = new BufferedOutputStream(new FileOutputStream(path));
            byte[] buf = new byte[4096];
            int temp = 0;
            while (true) {
                int len;
                if (size - temp > 0) {
                    len = inputArc.read(buf);
                } else {
                    saveArq.close();
                    break;
                }
                temp = temp + len;

                saveArq.write(buf, 0, len);
                saveArq.flush();
            }
            inputArc.close();
        } catch (IOException ex) {
            Logger.getLogger(ConsistencyManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void sendFile(String nomeArq) {
        try {
            File file = new File(nomeArq);
            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(conection.getOutputStream()));
            out.writeUTF(file.getName());
            out.writeLong(file.length());
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));

            byte[] buf = new byte[4096];
            while (true) {
                int len = in.read(buf);
                if (len == -1) {
                    break;
                }
                out.write(buf, 0, len);
                out.flush();
            }
            in.close();
        } catch(IOException e) {
            System.out.println("O ConsistencyManager falhou ao tentar enviar o arquivo " + nomeArq);
        }
    }
}
